<?php
/**
 * Created by PhpStorm.
 * User: stupboy
 * Date: 2018/2/26
 * Time: 15:53
 */

namespace app\adminapi\controller;

use \app\adminapi\model;
use app\adminapi\validate\Report;
use app\base\exception\RecordHasExistException;
use app\base\service\Csv;
use \think\Db;

/**
 * @name【司机管理】
 * @baseurl【adminapi/driver】
 * @file【Driver.php】
 */
class Driver extends Base
{

    /**
     * @name【获取车辆列表】
     * @desc【获取车辆列表】
     * @uri【searchCar】
     * @method【post】
     * @param【
     *  token $ string $ abc $ 验证字符 $ 1 #
     *  uid $ int $ 1 $ 用户id $ 1#
     *  type $ string $ 舒适 $ 类型 #
     *  company_id $ int $ 单位id #
     *  number $ string $ 闽CA1234 $ 车牌 #
     *  page $ int $ 1 $ 页数 #
     *  pagenum  $ int $ 10 $ 记录数
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息#
     * data $ int $  $ 数据 $ {"count":595,"list":[{"car_id":137,"number":"闽CS0722","car_type_name":"公务车舒适型","car_type_id":133},{"car_id":145,"number":"闽CC539E","car_type_name":"公务车商务型","car_type_id":134},{"car_id":154,"number":"闽D0021Y","car_type_name":"公务车舒适型","car_type_id":133},{"car_id":171,"number":"闽C0535Y","car_type_name":"约租车商务型","car_type_id":139}]}
     * 】
     */
    public function searchCar(){
        $page      = input('page',1);
        $pageNum   = input('pagenum',10);
        $type      = input('type','');
        $number    = input('number','');
        $companyId = input('company_id',0);
        $list      = (new model\Car())->getCar($type,$number,$page,$pageNum,$companyId);
        return $this->retSucc(['data'=>$list]);
    }

    /**
     * @name【获取已绑定车辆】
     * @desc【获取已绑定车辆】
     * @uri【getUseCar】
     * @method【post】
     * @param【
     *  token $ string $ abc $ 验证字符 $ 1 #
     *  uid $ int $ 1 $ 用户id $ 1#
     *  driver_id $ int $ 17 $ 司机id
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息#
     * data $ int $  $ 数据 $ [{"car_id":145,"number":"闽CC539E","car_type_name":"公务车商务型","weight":2,"name":"帅哥","is_default":0},{"car_id":137,"number":"闽CS0722","car_type_name":"公务车舒适型","weight":3,"name":"帅哥","is_default":1}]
     * 】
     */
    public function getUseCar(){
        $driverId = input('driver_id',0);
        $list = (new model\DriverCarUse())->getUseCar($driverId);
        return $this->retSucc(['data'=>$list]);
    }

    /**
     * @name【绑定车辆】
     * @desc【绑定车辆】
     * @uri【bindCar】
     * @method【post】
     * @param【
     *  token $ string $ abc $ 验证字符 $ 1 #
     *  uid $ int $ 1 $ 用户id $ 1#
     *  driver_id $ int $ 17 $ 司机id $ 1#
     *  car_id $ string $ [1,2] $ 车辆id $ 1
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息
     * 】
     */
    public function bindCar(){
        $driver_id      = input('driver_id',0);
        if(intval($driver_id)==0){
            return $this->retError('司机id不能为空');
        }
        $cars            = input('car_id');
        $carArr          = json_decode($cars,true);
        list($code,$msg) = (new model\DriverCarUse())->addCar($driver_id,$carArr);
        if($code==0){
            return $this->retError($msg);
        }else{
            return $this->retSucc();
        }
    }

    /**
     * @name【删除绑定车辆】
     * @desc【删除绑定车辆】
     * @uri【delBindCar】
     * @method【post】
     * @param【
     *  token $ string $ abc $ 验证字符 $ 1 #
     *  uid $ int $ 1 $ 用户id $ 1#
     *  driver_id $ int $ 17 $ 司机id $ 1#
     *  car_id $ string $ [1,2] $ 车辆id $ 1
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息
     * 】
     */
    public function delBindCar(){
        $driver_id      = input('driver_id',0);
        if(intval($driver_id)==0){
            return $this->retError('司机id不能为空');
        }
        $cars            = input('car_id');
        $carArr          = json_decode($cars,true);
        list($code,$msg) = (new model\DriverCarUse())->delCar($driver_id,$carArr);
        if($code==0){
            return $this->retError($msg);
        }else{
            return $this->retSucc();
        }
    }

    /**
     * @name【默认车辆】
     * @desc【默认车辆】
     * @uri【setDefaultCar】
     * @method【post】
     * @param【
     *  token $ string $ abc $ 验证字符 $ 1 #
     *  uid $ int $ 1 $ 用户id $ 1#
     *  driver_id $ int $ 17 $ 司机id $ 1#
     *  car_id $ int $ 1 $ 车辆id $ 1 #
     *  type $ int $ 1 $ 1为设置0为取消,默认1
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息
     * 】
     */
    public function setDefaultCar(){
        $driver_id    = input('driver_id',0);
        $car          = input('car_id',0);
        $type         = input('type',1);
        $driverCarUse = new model\DriverCarUse();
        $carInfo      = $driverCarUse->where('car_id',$car)->find();
        if(empty($carInfo)){
            return $this->retError('请先绑定车辆');
        }
        if($type==1){
            $otherDefault = Db::name('driver')->where('driver_id','<>',$driver_id)->where('car_id',$car)->find();
            if(!empty($otherDefault)){
                $otherInfo = '【'.$otherDefault['name'].':'.$otherDefault['phone'].'】';
                return $this->retError('该车辆已被其他司机设置为默认车辆'.$otherInfo);
            }
            $driverCarUse->save(['is_default'=>0],['driver_id'=>$driver_id]);
            $driverCarUse->save(['is_default'=>1],['driver_id'=>$driver_id,'car_id'=>$car]);
            Db::name('driver')->where('driver_id',$driver_id)->update(['car_id'=>$car]);
        }
        if($type==0){
            $driverCarUse->save(['is_default'=>0],['driver_id'=>$driver_id,'car_id'=>$car]);
            Db::name('driver')->where('driver_id',$driver_id)->update(['car_id'=>0]);
        }
        return $this->retSucc();
    }

    /**
     * @name【司机列表】
     * @desc【司机列表】
     * @uri【driverList】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * fields $ string $ driver_id,name $ 字段名称 #
     * where_json $ json $ {"order_id":["in","6,7,8"],"name":["like","%王%"]} $ 查询条件 #
     * page $ int $ 1$ 页数 #
     * pagenum $ int $ 10 $记录数
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息 #
     * data $ json $ $ 订单列表 #
     * description $ json $ $ 接口说明
     * 】
     */
    public function driverList(){
        $report    = new Report();
        $param     = $report->scene('report')->goCheck()->getCurrentData();
        $where     = json_decode($param['where_json'],true);
        list($code,$data) = (new model\Driver())->getDriverList($param['fields'],$where,$param['page'],$param['pagenum']);
        if($code==1){
            return $this->retSucc($data);
        }else{
            return $this->retError($data);
        }
    }

    /**
     * @name【司机列表下载】
     * @desc【司机列表下载】
     * @uri【downLoadDriverList】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * fields $ string $ order_id,passenger_name $ 字段名称 #
     * where_json $ json $ {"order_id":["in","6,7,8"],"name":["like","%王%"]} $ 查询条件 #
     * counts $ int $ 1$ 下载数据记录数
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息 #
     * data $ json $ $ 订单列表 #
     * description $ json $ $ 接口说明
     * 】
     */
    public function downLoadDriverList(){
        $this->cos();
        set_time_limit(300);
        $csv       = new Csv();
        $report    = new Report();
        $param     = $report->scene('download')->getCurrentData();
        $report->goCheck($param);
        $where     = json_decode($param['where_json'],true);
        $totalPage = $param['counts'] % 2000 == 0 ? $param['counts']/2000 : floor($param['counts']/2000) + 1;
        $f = [];
        for($i=1;$i<=$totalPage;$i++){
            list($code,$data) = (new model\Driver())->getDriverList($param['fields'],$where,$i,2000);
            if($code==0) continue;
            if(empty($data['data'])) break;
            $csv->open($data['fields']);

            $workStates = [
                1 => '执行任务中',
                2 => '有预约订单',
                3 => '听单中',
                4 => '下班',
            ];
            // 解析枚举值
            foreach ($data['data'] as $key => $val) {

                if (isset($data['data'][$key]['state']) && $data['data'][$key]['state'] === 9 ){
                    $data['data'][$key]['state'] = '禁用';
                } elseif (isset($data['data'][$key]['state']) && $data['data'][$key]['state'] === 1) {
                    $data['data'][$key]['state'] = '启用';
                }

                // 司机状态，1：执行任务中，2：有预约订单，3：听单中，4：下班
                if (isset($data['data'][$key]['work_state'])){
                    $data['data'][$key]['work_state'] = $workStates[ $data['data'][$key]['work_state'] ];
                }

            }

            $csv->writeAll($data['data']);
            $f[] = $csv->myClose();
        }
        $csv->mergeCsvToDownload($f);
    }

    /**
     * @name【增加司机】
     * @desc【增加司机】
     * @uri【add】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * user_id $ int $ 1 $ 归属用户id $ 1 #
     * company_id $ int $ 1 $ 单位id $ 1 #
     * name  $ string $ 张吴 $ 姓名 $ 1 #
     * id_card  $ string $ 350882198810171122 $ 身份证号码 $ 1 #
     * age $ int $ 28 $ 年龄 $ 1 #
     * birthday  $ date $ 1992-1-1 $ 出生日期 $ 1 #
     * sex $ int $ 1 $ 性别1男2女 $ 1 #
     * phone $ string $ 13559203611 $ 手机号码 $ 1 #
     * add $ string $ 泉州 $ 居住地址 #
     * driving_age $ string $ 3507 $ 身份证号码 $ 1 #
     * original_position $ string $ 开发 $ 原职位 #
     * language $ string $ 1 $ 语言 1普通话 $ 1 #
     * head_img $ string $   $ 头像地址 #
     * half_body_img $ string $  $ 半身照片 #
     * body_img $ string $  $ 名称  #
     * insurance_img $ string $  $ 保险图片  #
     * contract_img $ string $  $ 合同图片 #
     * id_img  $ string $  $ 身份证正面 #
     * id_img_back $ string $  $ 身份证背面 #
     * driver_license_img $ string $  $ 驾驶证照片  #
     * residence_permit_img $ string $  $ 居住证图片  #
     * bank_card $ string $ 622909408765565787 $ 银行卡号 #
     * wechat $ string $ 13959203655 $ 微信号 #
     * alipay $ string $ 13959203655 $ 支付宝#
     * register_time $ date $ 2017-1-1 $ 注册时间 #
     * driver_no $ string $ 默认值 $ 司机工号 #
     * bank $ string $ 中国银行 $ 开户行 #
     * edit_time $ date $ 2017-1-1 $ 编辑时间
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息
     * 】
     * @throws \app\base\exception\RecordNotFoundException
     * @throws \think\exception\DbException
     */
    public function add(){
        // 校验请求参数
        $validate = new \app\adminapi\validate\Driver();
        // 获取所有请求参数
        $params   = $validate->scene('add')->goCheck()->getCurrentData();
        $driver   = (new \app\adminapi\model\Driver()) ->createOrUpdate($params);
        return $this->retSucc(['driver_id' => $driver->driver_id]);
    }

    /**
     * @name【编辑司机】
     * @desc【编辑司机】
     * @uri【edit】
     * @method【post】
     * @param【
     * token $ string $ abc $ 验证字符 $ 1 #
     * uid $ int $ 1 $ 用户id $ 1 #
     * driver_id $ int $ 1 $ 司机id $ 1 #
     * user_id $ int $ 1 $ 归属用户id $ 1 #
     * company_id $ int $ 1 $ 单位id $ 1 #
     * name  $ string $ 章三 $ 姓名 $ 1 #
     * id_card  $ string $ 3507 $ 身份证号码 $ 1 #
     * age $ int $ 28 $ 年龄 $ 1 #
     * birthday  $ date $ 1992-1-1 $ 出生日期 $ 1 #
     * sex $ int $ 1 $ 性别1男2女 $ 1 #
     * phone $ string $ 135 $ 手机号码 $ 1 #
     * add $ string $ 泉州 $ 居住地址 #
     * driving_age $ string $ 3507 $ 身份证号码 $ 1 #
     * original_position $ string $ 开发 $ 原职位 #
     * language $ string $ 1 普通话 $ 语言 $ 1 #
     * head_img $ string $ upload/1.jpg  $ 头像地址 #
     * half_body_img $ string $ upload/1.jpg $ 半身照片 #
     * body_img $ string $ 默认值 $ 名称  #
     * insurance_img $ string $ 默认值 $ 保险图片  #
     * contract_img $ string $ 默认值 $ 合同图片 #
     * id_img  $ string $ 默认值 $ 身份证正面 #
     * id_img_back $ string $ 默认值 $ 身份证背面 #
     * driver_license_img $ string $ 默认值 $ 驾驶证照片  #
     * residence_permit_img $ string $ 默认值 $ 居住证图片  #
     * bank_card $ string $ 6222 $ 银行卡号 #
     * wechat $ string $ hello $ 微信号 #
     * alipay $ string $ 139 $ 支付宝#
     * register_time $ date $ 2017-1-1 $ 注册时间 #
     * driver_no $ string $ 默认值 $ 司机工号 #
     * bank $ string $ 中国银行 $ 开户行 #
     * edit_time $ date $ 2017-1-1 $ 编辑时间
     * 】
     * @return【
     * code $ int $ number|1-1 $ 校验码#
     * msg $ string $  $ 错误信息
     * 】
     * @throws \app\base\exception\RecordNotFoundException
     * @throws \think\exception\DbException
     * @throws  \app\base\exception\RecordHasExistException
     */
    public function edit(){
        // 校验请求参数
        $validate = new \app\adminapi\validate\Driver();
        // 获取所有请求参数
        $params   = $validate->scene('edit')->goCheck()->getCurrentData();
        $result   = (new \app\adminapi\model\Driver()) ->createOrUpdate($params);
        return $this->retSucc(['updated' => $result]);
    }

    /**
     * @name【删除司机】
     * @desc【删除司机】
     * @uri【delete】
     * @method【post】
     * @param【
     * driver_ids $ int $ 1 $ 司机id，多个请用','号连接 $ 1 #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * deleted $ int $  1 $ 删除的记录条数
     * 】
     */
    public function delete(){
        // 校验请求参数
        $validate = new \app\adminapi\validate\Driver();
        // 获取所有请求参数
        $params = $validate->scene('delete')->goCheck()->getCurrentData();

        $where = ['driver_id' => ['IN', explode(',', $params['driver_ids'])]];
        $buildQuery = function($query) use ($where) {
            model\Common::authCompanyQuery($query, $where, 'company_id');
        };

        $result = \app\adminapi\model\Driver::destroy($buildQuery);
        return $this->retSucc(['deleted' => $result]);
    }
}
